package cn.wolfcode.luowowo.service.impl;

import cn.wolfcode.luowowo.domain.Destination;
import cn.wolfcode.luowowo.domain.Region;
import cn.wolfcode.luowowo.domain.StrategyCatalog;
import cn.wolfcode.luowowo.query.DestinationQuery;
import cn.wolfcode.luowowo.repository.DestinationRepository;
import cn.wolfcode.luowowo.service.IDestinationService;
import cn.wolfcode.luowowo.service.IRegionService;
import cn.wolfcode.luowowo.service.IStrategyCatalogService;
import cn.wolfcode.luowowo.service.IStrategyService;
import cn.wolfcode.luowowo.util.DBHelper;
import cn.wolfcode.luowowo.util.MyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

//目的地业务实现类
@Service
public class DestinationServiceImpl implements IDestinationService {

    //注入,目的地数据接口
    @Autowired
    private DestinationRepository destinationRepository;

    //注入区域业务服务接口
    @Autowired
    private IRegionService regionService;

    @Autowired
    private MongoTemplate mongoTemplate;

    //攻略分类服务
    @Autowired
    private IStrategyCatalogService strategyCatalogService;

    //攻略明细服务
    @Autowired
    private IStrategyService strategyService;

    //根据id查询目的地信息(测试)
    @Override
    public Destination get(String id) {
        return destinationRepository.findById(id).orElse(null);
    }

    //搜索下级目的地的所有选项
    @Override
    public List<Destination> getDestByDeep(int deep) {
        //搜索下级目的地
        List<Destination> list = new ArrayList<>();
        for (int i = deep ; i > 1 ; --i) {
            list.addAll(destinationRepository.getDestByDeep(i));
        }
        return list;
    }
    //关联目的地的查询
    @Override
    public List<Destination> getDestByRegionId(String rid) {
        //查询区域的目的地关联id集合
        List<String> refIds = regionService.get(rid).getRefIds();
        //通过关联id集合查询所有的目的地  不分页
        return destinationRepository.findByParentIdIn(refIds , null);
    }
    //分页,查询
    @Override
    public Page<Destination> list(DestinationQuery qo) {
        //创建条件对象
        Query query = new Query();
        //有高查则添加高查
        String keyword = qo.getKeyword();
        //有关键字时关键字优先
        if(StringUtils.hasLength(keyword)){
            query.addCriteria(Criteria.where("name").regex(".*"+keyword+".*"));
        }else {
            //没有关键字则按层次
            //有选择上一级则设置上一级条件,没有则是查询最高级(也就是没有上一级的目的地)
            if(StringUtils.hasLength(qo.getParentId())){
                query.addCriteria(Criteria.where("parentId").is(qo.getParentId()));
            }else{
                query.addCriteria(Criteria.where("parentId").is(null));
            }
        }
        //调用数据库工具类查询
        return DBHelper.PagingQuery(mongoTemplate, query, Destination.class,qo.getPageable());
    }

    //根>>中国>>广东>>广州:    parentId:广州id
    //导航查询  统一通过当前id向上查询父id,查询到没有父id为止,集合排序父在最前
    @Override
    public List<Destination> getToasts(String parentId) {
        //如果当前id为空则返回空集合
        if(!StringUtils.hasLength(parentId)){
            return Collections.emptyList();
        }else {
            //创建空集合用于存储导航上的内容
            List<Destination> list = new ArrayList<>();
            do{
                //查询当前目的地   如广州
                Destination destination = destinationRepository.findById(parentId).orElse(null);
                //查询到有内容则加入集合
                if (destination != null){
                    list.add(destination);
                }
                //获取上一级（父id）如广东id
                parentId = destination.getParentId();
                //如果有上一级则继续查
            } while (parentId != null);
            Collections.reverse(list);  //取反
            return list;
        }
    }
    //根据区域id查询关联目的地下的所有子目的地
    //有额外的逻辑判断，不掉用原先的getDestByRegionId()
    @Override
    public List<Destination> getDestByRegionIdForApi(String regionId) {
        //准备空集合封装
        List<Destination> list = new ArrayList();
        //创建分页对象    防止子地区(第二级)太多页面不美观,只显示8个
        PageRequest pageable = PageRequest.of(0,8);
        //国内
        if("-1".equals(regionId)) {
            //所有的省
            list = destinationRepository.findByParentName("中国" , pageable);
        }else{
            //非国内,先查下关联目的地的id集合
            Region region = regionService.get(regionId);
            List<String> refIds = region.getRefIds();
            //通过关联id集合查询区域下的目的地
            list = destinationRepository.findByIdIn(refIds,pageable);
        }

        //mongodb没有以前的联表查询操作,只能手动操作
        //城市
        for (Destination destination : list) {
//            //以自己为父目的地的id（没有就用父目的地name都没有则不查）查询子目的地
//            String id = destination.getId();
//            String name = destination.getName();
//            if (StringUtils.hasLength(id)){
//                list2 = destinationRepository.findByParentId(id , pageable);
//            }else if (StringUtils.hasLength(name)){
//                list2 = destinationRepository.findByParentName(name , pageable);
//            }
//            //查询出来的子目的地设置到自己的对象中
//            if (list2 != null){
//                destination.setChildren(list2);
//            }

            //判断该省份下有没有城市有则调用递归方法查询
                List<Destination> list1 = destinationRepository.findByParentId(destination.getId());
                if (list1 != null && list1.size() > 0) {
                    recursion(list1);
                    destination.setChildren(list1);
                }
        }
        return list;
    }
    //递归方法  一直查询直到没有子目的地
    public void recursion(List<Destination> list) {
        for (Destination destination : list) {
            //看看是不是到最底了
            if(3 > destination.getDeep()) {
                List<Destination> list1 = destinationRepository.findByParentId(destination.getId());
                if (list1.size() > 0 && list1 != null) {
                    recursion(list1);
                    destination.setChildren(list1);
                }
            }
        }
    }

    //更新目的地简介
    @Override
    public void updateInfo(String id, String info) {
        MyUtils.hasLength(id,"请正常选择要更新简介的目的地");
        MyUtils.hasLength(info,"简介内容不能为空");
        //全量更新,先查询替换后修改
        Destination destination = destinationRepository.findById(id).orElse(null);
        destination.setInfo(info);
        destinationRepository.save(destination);
    }
    //目的地下的分类目录
    @Override
    public List<StrategyCatalog> catalogs(String destId) {
        //查询分类
        List<StrategyCatalog> list = strategyCatalogService.findByDestId(destId);
        //查询每个分类下的攻略
        for (StrategyCatalog catalog : list) {
            catalog.setStrategies(strategyService.findByCatalogId(catalog.getId()));
        }
        return list;
    }
    //查询所有目的地
    @Override
    public List<Destination> listAll() {
        return destinationRepository.findAll();
    }
}
